package string;

public class StringDemo {
    public static void main(String[] args) {
        String s1 = "123abc";  //字面量创建的字符串第一次使用时会缓存在常量池中
        String s2 = "123abc";  //重用s1对象(重用常量池中“123abc”对象)
        System.out.println(s1==s2);  //true
        String s3 = "123abc";
        System.out.println(s1==s3);  //true

        String s4 = new String("123abc");
        System.out.println(s1==s4);  //false

        s1 = s1 + "!";  //字符串是不变对象，修改内容会创建新对象
        System.out.println(s1==s2); //false

        String s5 = "123"+"abc";  //触发预计算,直接编译为String s5 = "123abc"，jvm会复用该对象
        System.out.println(s5==s2);  //true

        String s = "123";
        String s6 = s + "abc";  //这里编译器不做预计算操作，拼接字符串会产生新对象
        System.out.println(s6==s2);  //false，没有重用常量池对象

        /*
        * ==是比较值是否相等，对于应用类型而言，引用中保存的是地址，所以==比较的是地址，
        * 地址相同意味着两个引用指向了同一个对象
        * 对于字符串而言，实际应用中我们通常希望比较的是里面的值用equals*/
        String s7 = "123abc";
        String s8 = new String("123abc");
        System.out.println(s7==s8);
        System.out.println(s7.equals(s8));
    }
}
